/**
 * 提示词模板服务
 * 处理提示词模板的增删改查等操作
 */
import { BaseService } from '../../shared/services/base-service'
import type { ApiResponse } from '../../../types/api'

// 提示词模板信息
export interface PromptTemplate {
  id: number
  name: string
  content: string
  description?: string
  category?: string
  tags?: string
  model?: string
  usageCount?: number
  createdAt?: string
  updatedAt?: string
}

// 创建/更新模板参数
export interface PromptTemplateParams {
  name: string
  content: string
  description?: string
  category?: string
}

export class PromptService extends BaseService {
  constructor() {
    super()
  }

  /**
   * 获取提示词模板列表
   */
  async getPromptTemplates(): Promise<ApiResponse<PromptTemplate[]>> {
    return this.get<PromptTemplate[]>('/prompt/templates')
  }

  /**
   * 根据ID获取提示词模板
   */
  async getPromptTemplateById(id: number): Promise<ApiResponse<PromptTemplate>> {
    return this.get<PromptTemplate>(`/prompt/templates/${id}`)
  }

  /**
   * 创建提示词模板
   */
  async createPromptTemplate(template: PromptTemplateParams): Promise<ApiResponse<PromptTemplate>> {
    return this.post<PromptTemplate>('/prompt/templates', template)
  }

  /**
   * 更新提示词模板
   */
  async updatePromptTemplate(id: number, template: PromptTemplateParams): Promise<ApiResponse<PromptTemplate>> {
    return this.put<PromptTemplate>(`/prompt/templates/${id}`, template)
  }

  /**
   * 删除提示词模板
   */
  async deletePromptTemplate(id: number): Promise<ApiResponse<any>> {
    return this.delete(`/prompt/templates/${id}`)
  }

  /**
   * 根据分类获取提示词模板
   */
  async getTemplatesByCategory(category: string): Promise<ApiResponse<PromptTemplate[]>> {
    return this.get<PromptTemplate[]>(`/prompt/templates/category/${category}`)
  }

  /**
   * 根据名称搜索提示词模板
   */
  async searchTemplatesByName(name: string): Promise<ApiResponse<PromptTemplate[]>> {
    return this.get<PromptTemplate[]>(`/prompt/templates/search/name?name=${encodeURIComponent(name)}`)
  }

  /**
   * 根据标签搜索提示词模板
   */
  async searchTemplatesByTag(tag: string): Promise<ApiResponse<PromptTemplate[]>> {
    return this.get<PromptTemplate[]>(`/prompt/templates/search/tag?tag=${encodeURIComponent(tag)}`)
  }

  /**
   * 增加提示词模板使用次数
   */
  async incrementPromptTemplateUsage(id: number): Promise<ApiResponse<any>> {
    return this.post(`/prompt/templates/${id}/increment`)
  }

  /**
   * 测试提示词模板流式接口
   * @param message 用户消息
   * @param systemPromptStr 系统提示词字符串
   * @param modelId 模型ID
   * @param callbacks 回调函数对象，包含onMessage、onComplete、onError
   */
  async testPromptTemplateStream(
    message: string, 
    systemPromptStr: string, 
    modelId: number,
    callbacks: {
      onMessage: (data: { event: string; data: string }) => void
      onComplete: () => void
      onError: (error: Error) => void
    }
  ): Promise<void> {
    try {
      // 构建请求头
      const headers: Record<string, string> = {
        'Content-Type': 'application/json',
        'Accept': 'text/plain;charset=UTF-8'
      }
      
      // 使用fetch API调用流式接口
      const response = await fetch(`${import.meta.env.VITE_API_BASE_URL || 'http://127.0.0.1:8080'}/prompt/templates/test-stream`, {
        method: 'POST',
        headers: headers,
        body: JSON.stringify({
          message,
          systemPromptStr,
          modelId
        })
      });
      
      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
      }
      
      // 获取流式响应
      const reader = response.body?.getReader();
      const decoder = new TextDecoder();
      
      // 累积内容
      let accumulatedContent = '';
      
      if (reader) {
        let done = false;
        while (!done) {
          const { value, done: readerDone } = await reader.read();
          done = readerDone;
          
          if (value) {
            const chunk = decoder.decode(value, { stream: true });
            
            // 累积内容
            accumulatedContent += chunk;
            
            // 触发消息回调，发送累积的完整内容
            callbacks.onMessage({
              event: 'message',
              data: accumulatedContent
            });
          }
        }
      }
      
      // 流结束，触发完成回调
      callbacks.onComplete();
    } catch (error) {
      console.error('测试提示词模板失败:', error);
      callbacks.onError(error as Error);
      throw error;
    }
  }
}

// 创建单例实例
export const promptService = new PromptService()

export default PromptService